#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 生成器函数 generator function
# 定义一个生成器函数，该函数返回一个生成器对象，该对象可以迭代

gen = (i for i in range(1000000000))
type(gen)  # <class 'generator'>
next(gen)
next(gen)
next(gen)  # 等等，生成器对象可以迭代


# 注意：生成器函数只能使用一次，因为它返回的是一个生成器对象，只能迭代一次。
# 如果需要迭代多次，需要重新生成生成器对象。

# 另外，生成器函数可以用在需要迭代大量数据的场合，比如读取文件、网络数据等。
# 因为生成器函数返回的是一个生成器对象，可以节省内存，并且可以迭代多次。

# 总结：生成器函数是一种特殊的函数，它返回一个生成器对象，该对象可以迭代。
# 生成器函数只能使用一次，因为它返回的是一个生成器对象，只能迭代一次。
# 如果需要迭代多次，需要重新生成生成器对象。
# 生成器函数可以用在需要迭代大量数据的场合，比如读取文件、网络数据等。
# 因为生成器函数返回的是一个生成器对象，可以节省内存，并且可以迭代多次。

def fibonacci(n):
    a, b = 0, 1
    for i in range(n):
        yield a
        a, b = b, a + b


# 调用生成器函数
for i in fibonacci(10):
    print(i)

# yield 关键字的作用：
# 1. 它把函数变成了一个生成器函数，函数中包含 yield 关键字，函数执行到 yield 关键字时，函数会暂停并返回一个值，
#    并在下一次执行 next() 方法时从暂停的地方继续执行。
# 2. 调用生成器函数时，函数会返回一个生成器对象，该对象可以迭代。
# 3. 生成器对象只能迭代一次，因为它只能生成一次值。
# 4. 生成器对象可以用 for 循环迭代，也可以用 next() 方法迭代。